use gloo::net::http::{Method, Request, RequestBuilder};
use gloo::net::Error;
use serde::Deserialize;

pub async fn fetch<T: for<'a> Deserialize<'a>>(
    url: String,
    method: Method,
    body: Option<String>,
    // content_type: Option<String>,
) -> Result<T, String> {
    let req = RequestBuilder::new(&url).method(method);

    // let req = match content_type {
    //     Some(content_type) => req.header("Content-Type", &content_type),
    //     None => req,
    // };

    let resp = match body {
        Some(body) => req.body(body),
        None => Err(Error::GlooError("请求体不能为空".to_string())),
    }
    .unwrap()
    .send()
    .await;

    match resp {
        Ok(r) => match r.json::<T>().await {
            Ok(r) => Ok(r),
            Err(e) => Err(format!("无法解析响应：{e}")),
        }
        Err(e) => Err(format!("无法发送请求：{e}")),
    }

    // match resp {
    //     // HTTP status code 2xx (成功)
    //     Ok(r) if r.status().to_string().starts_with('2') => match r.json::<T>().await {
    //         Ok(r) => Ok(r),
    //         Err(e) => Err(format!("无法解析响应：{e}")),
    //     },
    //     // 服务器返回了错误
    //     Ok(r) => Err(format!(
    //         "{} ({} {})",
    //         r.text().await.unwrap(),
    //         r.status(),
    //         r.status_text()
    //     )),
    //     Err(e) => Err(format!("无法发送请求：{e}")),
    // }
}
